package com.guaoran.interview.in2018.accesslevel;

import com.guaoran.interview.in2018.accesslevel.domain.AccessLevelDemo;
import com.guaoran.interview.in2018.accesslevel.domain.AccessLevelDemoSamePackageTest;

/**
 * @Author gucheng
 * @Description 访问级别测试
 * 2019-08-14 16:25
 */
public class AccessLevelDemoTest extends AccessLevelDemo{
    /**
     * 访问级别有四种：
     *  public           :  公有  访问最大，任何时候都可以通过该对象或对象的子类（public)访问
     *  private          :  私有  访问最小，只能在该类的内部进行访问
     *                   :  默认  只能在该类的同一个包下通过对象访问
     *  protected        :  保护  只能在该类的同一个包下或该类的子类中访问
     * @param args
     */
    public static void main(String[] args) {
        AccessLevelDemoTest test = new AccessLevelDemoTest();
        test.testNotInTheSamePackage();
        test.testNotInTheSamePackageButExtend();
        test.testInTheSamePackage();
    }

    /**
     * 测试不在同一个包下的访问级别的问题
     */
    public void testNotInTheSamePackage(){
        AccessLevelDemo demo = new AccessLevelDemo();
        // 由于 getPrivate0() 是 private 级别所以只能在类的内部进行调用 ，如：this.private0 = private0;
//        System.out.println("不在同一个包下："+demo.getPrivate0());

        // 由于 getDefault0() 访问级别是默认级别，即只能在同包下可以访问，所以这里编译不通过
//        System.out.println("不在同一个包下："+demo.getDefault0());

        // 由于 getProtected0() 访问级别是 protected 的，所以只能在同包或其子类中可以访问，所以这里编译不通过
        //System.out.println("不在同一个包下："+demo.getProtected0());

        // 由于 getPublic0() 访问级别是 public 的，所以这里是可以访问的。
        System.out.println("不在同一个包下："+demo.getPublic0());
    }

    /**
     * 测试不在同一个包下但是通过继承的访问级别的问题
     */
    public void testNotInTheSamePackageButExtend() {
        AccessLevelDemoTest demo = new AccessLevelDemoTest();
        // 由于 getPrivate0() 是 private 级别所以只能在类的内部进行调用 ，如：this.level = level;
//        System.out.println("不在同一个包下，但是通过继承实现："+demo.getPrivate0());

        // 由于 getDefault0() 访问级别是默认级别，即只能在同包下可以访问，所以这里编译不通过
//        System.out.println("不在同一个包下，但是通过继承实现："+demo.getDefault0());

        // 由于 getProtected0() 访问级别是 protected 的，所以只能在同包或其子类中可以访问，由于已经继承了该类，所以这里可以访问
        System.out.println("不在同一个包下，但是通过继承实现："+demo.getProtected0());

        // 由于 getPublic0() 访问级别是 public 的，所以这里是可以访问的。
        System.out.println("不在同一个包下，但是通过继承实现："+demo.getPublic0());
    }

    /**
     * 测试在同一个包下访问级别的问题
     */
    public void testInTheSamePackage() {
        AccessLevelDemoSamePackageTest samePackageTest = new AccessLevelDemoSamePackageTest();
        samePackageTest.testInTheSamePackage();
    }
}
